`timescale 1ns/1ps
`default_nettype none
//文件名：rtl/mem_wb_reg.v
//作用：MEM到WB阶段寄存器
module mem_wb_reg(
    input  wire        clk,          // 时钟：上升沿触发
    input  wire        rstn,         // 同步复位（低有效）：拉低时清零所有输出寄存器
    // ---------- 来自 MEM 阶段（本拍产生） ----------
    input  wire [31:0] mem_alu_y,    // 来自 MEM 阶段的 ALU 结果（当前即最终写回值）
    input  wire [31:0] mem_rdata,    // ★ dmem 读回值（LW）
    input  wire [31:0] mem_pc4,      // ★ 新增
    input  wire [4:0]  mem_rd,       // 本条指令的目的寄存器号
    input  wire        mem_regwrite, // 本条指令是否需要在 WB 写回寄存器
    input  wire        mem_memtoreg, // ★
    input  wire        mem_jal,      // ★ 新增 JAL
    input  wire        mem_jalr,     // ★ 新增 JALR

    // ====== 新增：CSR ======
    input  wire        mem_is_csr,         // CSR 指令
    input  wire [31:0] mem_csr_rdata,      // CSR 旧值（写回）
    // ---------- 输出到 WB 阶段（下一拍被使用） ----------
    output reg  [31:0] wb_alu_y,     // 打拍后的 ALU 结果 → 作为写回数据
    output reg  [31:0] wb_rdata,     // ★
    output reg  [31:0] wb_pc4,       // ★ 新增
    output reg  [4:0]  wb_rd,        // 打拍后的 rd → 寄存器堆写回地址
    output reg         wb_regwrite,  // 打拍后的写回使能 → 控制寄存器堆写使能
    output reg         wb_memtoreg,   // ★
    output reg         wb_jal,        // ★ 新增 JAL
    output reg         wb_jalr,       // ★ 新增 JALR
    // ====== 新增：CSR ======
    output reg         wb_is_csr,
    output reg  [31:0] wb_csr_rdata
);
    // 时序逻辑：同步复位清零；否则把 MEM 信号在时钟上升沿锁存到 WB 输出
    always @(posedge clk) begin
        if (!rstn) begin
            wb_alu_y    <= 32'b0;
            wb_rdata    <= 32'b0;
            wb_pc4      <= 32'b0;       // ★
            wb_rd       <= 5'b0;
            wb_regwrite <= 1'b0;
            wb_memtoreg <= 1'b0;
            wb_jal      <= 1'b0;        // ★
            wb_jalr     <= 1'b0;        // ★

            wb_is_csr    <= 1'b0;
            wb_csr_rdata <= 32'b0;
        end else begin
            wb_alu_y    <= mem_alu_y;
            wb_rdata    <= mem_rdata;
            wb_pc4      <= mem_pc4;       // ★
            wb_rd       <= mem_rd;
            wb_regwrite <= mem_regwrite;
            wb_memtoreg <= mem_memtoreg;
            wb_jal      <= mem_jal;       // ★
            wb_jalr     <= mem_jalr;    // ★

            wb_is_csr    <= mem_is_csr;
            wb_csr_rdata <= mem_csr_rdata;
        end
    end

endmodule